{
 "cells": [
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "**问题：**\n",
    "假设你正在为一个电影推荐系统设计一个简单的KNN算法。我们有以下一些用户的电影评分数据，数据由两个特征组成：用户对电影A和电影B的评分，分别在1-5之间。用户的标签（电影类型偏好）是动作片（标签0）或者是喜剧片（标签1）。我们有一个新用户，他给电影A评分为3，电影B评分为4。请问这个用户可能偏好哪种类型的电影？\n",
    "\n",
    "**数据：**\n",
    "\n",
    "| 用户   | 电影A评分 | 电影B评分 | 偏好类型 |\n",
    "| ------ | --------- | --------- | -------- |\n",
    "| 用户1  | 5         | 1         | 动作片   |\n",
    "| 用户2  | 4         | 2         | 动作片   |\n",
    "| 用户3  | 2         | 5         | 喜剧片   |\n",
    "| 用户4  | 1         | 4         | 喜剧片   |\n",
    "| 用户5  | 3         | 2         | 动作片   |\n",
    "| 用户6  | 2         | 5         | 喜剧片   |\n",
    "\n",
    "你需要做以下步骤：\n",
    "1. 构造数据\n",
    "2. 创建KNN模型\n",
    "3. 使用数据训练模型\n",
    "4. 预测新用户的喜好"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 0. 引入核心包"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "import numpy as np\n",
    "import matplotlib.pyplot as plt\n",
    "from sklearn.neighbors import KNeighborsClassifier"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 1. X, y"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 创建示例数据\n",
    "X = np.array([[1, 4], [2, 5], [3, 2], [4, 2], [5, 1]])  # 电影A和电影B的评分 #TODO\n",
    "y = np.array([0, 0, 1, 1, 1])  # 0表示动作片，1表示喜剧片 #TODO"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 2. 创建 KNN 模型\n",
    "k = 1"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [],
   "source": [
    "knn = KNeighborsClassifier(n_neighbors=1) #TODO"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 3. 训练模型"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<style>#sk-container-id-1 {color: black;}#sk-container-id-1 pre{padding: 0;}#sk-container-id-1 div.sk-toggleable {background-color: white;}#sk-container-id-1 label.sk-toggleable__label {cursor: pointer;display: block;width: 100%;margin-bottom: 0;padding: 0.3em;box-sizing: border-box;text-align: center;}#sk-container-id-1 label.sk-toggleable__label-arrow:before {content: \"▸\";float: left;margin-right: 0.25em;color: #696969;}#sk-container-id-1 label.sk-toggleable__label-arrow:hover:before {color: black;}#sk-container-id-1 div.sk-estimator:hover label.sk-toggleable__label-arrow:before {color: black;}#sk-container-id-1 div.sk-toggleable__content {max-height: 0;max-width: 0;overflow: hidden;text-align: left;background-color: #f0f8ff;}#sk-container-id-1 div.sk-toggleable__content pre {margin: 0.2em;color: black;border-radius: 0.25em;background-color: #f0f8ff;}#sk-container-id-1 input.sk-toggleable__control:checked~div.sk-toggleable__content {max-height: 200px;max-width: 100%;overflow: auto;}#sk-container-id-1 input.sk-toggleable__control:checked~label.sk-toggleable__label-arrow:before {content: \"▾\";}#sk-container-id-1 div.sk-estimator input.sk-toggleable__control:checked~label.sk-toggleable__label {background-color: #d4ebff;}#sk-container-id-1 div.sk-label input.sk-toggleable__control:checked~label.sk-toggleable__label {background-color: #d4ebff;}#sk-container-id-1 input.sk-hidden--visually {border: 0;clip: rect(1px 1px 1px 1px);clip: rect(1px, 1px, 1px, 1px);height: 1px;margin: -1px;overflow: hidden;padding: 0;position: absolute;width: 1px;}#sk-container-id-1 div.sk-estimator {font-family: monospace;background-color: #f0f8ff;border: 1px dotted black;border-radius: 0.25em;box-sizing: border-box;margin-bottom: 0.5em;}#sk-container-id-1 div.sk-estimator:hover {background-color: #d4ebff;}#sk-container-id-1 div.sk-parallel-item::after {content: \"\";width: 100%;border-bottom: 1px solid gray;flex-grow: 1;}#sk-container-id-1 div.sk-label:hover label.sk-toggleable__label {background-color: #d4ebff;}#sk-container-id-1 div.sk-serial::before {content: \"\";position: absolute;border-left: 1px solid gray;box-sizing: border-box;top: 0;bottom: 0;left: 50%;z-index: 0;}#sk-container-id-1 div.sk-serial {display: flex;flex-direction: column;align-items: center;background-color: white;padding-right: 0.2em;padding-left: 0.2em;position: relative;}#sk-container-id-1 div.sk-item {position: relative;z-index: 1;}#sk-container-id-1 div.sk-parallel {display: flex;align-items: stretch;justify-content: center;background-color: white;position: relative;}#sk-container-id-1 div.sk-item::before, #sk-container-id-1 div.sk-parallel-item::before {content: \"\";position: absolute;border-left: 1px solid gray;box-sizing: border-box;top: 0;bottom: 0;left: 50%;z-index: -1;}#sk-container-id-1 div.sk-parallel-item {display: flex;flex-direction: column;z-index: 1;position: relative;background-color: white;}#sk-container-id-1 div.sk-parallel-item:first-child::after {align-self: flex-end;width: 50%;}#sk-container-id-1 div.sk-parallel-item:last-child::after {align-self: flex-start;width: 50%;}#sk-container-id-1 div.sk-parallel-item:only-child::after {width: 0;}#sk-container-id-1 div.sk-dashed-wrapped {border: 1px dashed gray;margin: 0 0.4em 0.5em 0.4em;box-sizing: border-box;padding-bottom: 0.4em;background-color: white;}#sk-container-id-1 div.sk-label label {font-family: monospace;font-weight: bold;display: inline-block;line-height: 1.2em;}#sk-container-id-1 div.sk-label-container {text-align: center;}#sk-container-id-1 div.sk-container {/* jupyter's `normalize.less` sets `[hidden] { display: none; }` but bootstrap.min.css set `[hidden] { display: none !important; }` so we also need the `!important` here to be able to override the default hidden behavior on the sphinx rendered scikit-learn.org. See: https://github.com/scikit-learn/scikit-learn/issues/21755 */display: inline-block !important;position: relative;}#sk-container-id-1 div.sk-text-repr-fallback {display: none;}</style><div id=\"sk-container-id-1\" class=\"sk-top-container\"><div class=\"sk-text-repr-fallback\"><pre>KNeighborsClassifier(n_neighbors=1)</pre><b>In a Jupyter environment, please rerun this cell to show the HTML representation or trust the notebook. <br />On GitHub, the HTML representation is unable to render, please try loading this page with nbviewer.org.</b></div><div class=\"sk-container\" hidden><div class=\"sk-item\"><div class=\"sk-estimator sk-toggleable\"><input class=\"sk-toggleable__control sk-hidden--visually\" id=\"sk-estimator-id-1\" type=\"checkbox\" checked><label for=\"sk-estimator-id-1\" class=\"sk-toggleable__label sk-toggleable__label-arrow\">KNeighborsClassifier</label><div class=\"sk-toggleable__content\"><pre>KNeighborsClassifier(n_neighbors=1)</pre></div></div></div></div></div>"
      ],
      "text/plain": [
       "KNeighborsClassifier(n_neighbors=1)"
      ]
     },
     "execution_count": 4,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "knn.fit(X, y)  # TODO"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 4. 用模型推理(预测)用户的喜好"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [],
   "source": [
    "new_user = np.array([[3, 4]])\n",
    "prediction = knn.predict(new_user) #TODO"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 5. 数据可视化"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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RERERCosjIiIiIhUWBgRERERqbAwIiIiIlJhYURERESkwsKIiIiISIWFEREREZEKCyMiIiIiFRZGRERERCosjIiIiIhUWBgRERERqbAwIiIiIlJhYURERESkwsKIiIiISIWFEREREZEKCyMiIiIiFRZGRERERCosjIiIiIhUWBgRERERqbAwIiIiIlJhYURERESkwsKIiIiISIWFEREREZEKCyMiIiIiFRZGRERERCosjIiIiIhUWBgRERERqbAwIiIiIlIxaWG0d+9e9OnTB56enpAkCZs2bSqzf2JiIiRJ0vr566+/qiZgIiIismgyUx78wYMHaNOmDUaOHIkBAwZUeL9z587B2dlZ/bpu3brGCI+IiIieMCYtjHr16oVevXrpvZ+bmxtq1apl+ICIiIjoiWbSwuhx+fv7Izc3Fy1btsTs2bPRrVu3UvsqFAooFAr166ysLACAUqmEUqk0aFzF4xl63OrC0vMDLD9H5mf+LD1H5mf+jJVjVb1nkhBCVMmRyiFJEjZu3Ih+/fqV2ufcuXPYu3cv2rdvD4VCge+++w7R0dFITExE586dde4zZ84czJ07V6s9Pj4eDg4OhgqfiIiIjCgnJwdDhw7FvXv3NJbTGJpZFUa69OnTB5IkYfPmzTq36zpj5O3tjZs3bxr8jVUqldi1axdCQ0NhY2Nj0LGrA0vPD7D8HJmf+bP0HJmf+TNWjllZWahTp47RCyOzvJRWUlBQENasWVPqdrlcDrlcrtVuY2NjtF9KY45dHVh6foDl58j8zJ+l58j8zJ+hc6yq98vs72OUnJwMDw8PU4dBREREFsCkZ4yys7Pxzz//qF9funQJJ06cQO3atVG/fn3MnDkTaWlpWL16NQAgKioKvr6+aNWqFfLy8rBmzRokJCQgISHBVCkQERGRBTFpYXT06FGNb5RNnToVABAZGYnY2Fikp6cjNTVVvT0vLw/Tp09HWloa7O3t0apVK2zduhXh4eFVHjsRERFZHpMWRl27dkVZa79jY2M1Xs+YMQMzZswwclRERET0pDL7NUZEREREhsLCiIiIiEiFhRERERGRCgsjIiIiIhUWRkREREQqLIyIiIiIVFgYEREREamwMCIiIiJSYWFEREREpMLCiIiIiEiFhRERERGRCgsjIiIiIhUWRkREREQqLIyIiIiIVFgYEREREamwMCIiIiJSYWFE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",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.title(\"User Movie Preference\", size=15) \n",
    "plt.xlabel(\"Movie A rating\")\n",
    "plt.ylabel(\"Movie B rating\")\n",
    "plt.grid()\n",
    "\n",
    "# 绘制原始样本点，要求不同的影片喜好类别用不同的颜色标记\n",
    "# 提示: 用scatter散点图绘制，用它的参数c实现不同的类别用不同的颜色标记\n",
    "plt.scatter(X[:, 0], X[:, 1], c=y, cmap='coolwarm', s=60) #TODO\n",
    "\n",
    "# 绘制新数据点，用红色x标记，大小为8\n",
    "# 提示：用plt.plot()绘制，用它的参数marker实现不同的标记符号\n",
    "plt.plot(new_user[0, 0], new_user[0, 1], 'rx', markersize=10) #TODO\n",
    "\n",
    "# 新数据最近邻索引为第一个最近邻的索引\n",
    "dist, idx = knn.kneighbors(new_user) #TODO\n",
    "nearest = X[idx[0][0]] #TODO # 获取最近邻点的坐标，这是一个列表，第一个元素是x坐标，第二个元素是y坐标\n",
    "\n",
    "# 用红线标记新数据点与最近邻点的连接线\n",
    "# 提示：用plt.plot()绘制，用 r-- 实现红色虚线\n",
    "plt.plot([new_user[0, 0], nearest[0]], [new_user[0, 1], nearest[1]], 'r--') #TODO\n",
    "\n",
    "# 为每个点添加坐标文本  \n",
    "for x, y in zip(X[:, 0], X[:, 1]):\n",
    "    plt.text(x, y+0.1, f'({x}, {y})') \n",
    "\n",
    "# 为新数据点添加坐标文本\n",
    "plt.text(new_user[0,0], new_user[0,1]+0.1, f'({new_user[0,0]}, {new_user[0,1]})')\n",
    "plt.show()"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.8.0"
  },
  "orig_nbformat": 4
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
